import java.util.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.Socket;
               
    public class DataList implements Serializable {
    		static final long serialVersionUID = 434L;
    		
            private Map<Integer,Data> mp;
     
            public DataList()
            {
                    mp = new HashMap<Integer,Data>();
            }

            public int printSize() {
            	for(int i = 0; i<mp.size(); i++) {
            		//System.out.println(mp.get(i).sumaKontrolna);
            	}
            	return mp.size();
            }
            public Map<Integer,Data> getHashMap() {
                return mp;
            }
                    private class Data implements Serializable{
                    	static final long serialVersionUID = 43L;
                            private String sumaKontrolna;
                            private LinkedList<Integer> lista_serwerow;
     
                            Data(String sk)
                            {
                                    sumaKontrolna = new String();
                                    sumaKontrolna = sk;
                                    lista_serwerow = new LinkedList<Integer>();
                            }
                            public void addServer(int id)
                            {
                                    lista_serwerow.add(id);
                            }
                            public String getSumaKontrolna()
                            {
                                return sumaKontrolna ;
                            }
                            public LinkedList<Integer> getListaSerwerow()
                            {
                                return lista_serwerow ;
                            }
                    }
     
            public synchronized void addRecord(int key, String suma, int port) {
                    Data data = mp.get(key) ;
                    

                    if (data != null) {
                    	System.out.println("juz jest taki klucz");
                         // id serwera

                    	String s = data.getSumaKontrolna();
	                    if (!s.equals(suma) ) //zmodyfikowano wartosc dlatego trzeba utworzyc nowa
	                    {
                            System.out.println("Suma kontrolna zostala zmodyfikowana. Stara suma: " + s + " nowa suma " + suma);
	                        mp.remove(data) ;
	                        data = new Data(suma) ;
	                        data.addServer(port) ;
	                        mp.put(key, data) ;
	                    }

	                    else
	                    {
                            System.out.println("Dodajemy nowy serwer dla tego klucza" + port);
	                        data.addServer(port) ;
                            for (int i=0; i<mp.get(key).getListaSerwerow().size(); i++)
                             {
                            System.out.println(mp.get(key).getListaSerwerow().get(i));
                            }

	                    }
	                    
	              
                	}

                	else {

                        System.out.println("Dodajemy nowy klucz: " + key);
                		data = new Data(suma);
                		data.addServer(port);
                		mp.put(key, data);
                	}     
                    
                    try
                    {
                       FileOutputStream fileOut =
                       new FileOutputStream("pliki.ser");
                       ObjectOutputStream out =
                                          new ObjectOutputStream(fileOut);
                       out.writeObject(this);
                       out.close();
                        fileOut.close();
                    }catch(IOException i)
                    {
                        i.printStackTrace();
                    }

            }

            public synchronized int checkFile(int key, String suma) {
                Data data = mp.get(key);
                System.out.println(mp.get(key));

                if (data != null) //jesli rekord usunieto
                {
                    String s = data.getSumaKontrolna();
                    if(!s.equals(suma))
                    {
                        System.out.println("Suma sie nie zgadza, trzeba zmodyfikowac");
                        return -1;
                    }
                    return 0; //wszystko ok
                }
                return 1; //rekord nie istnieje, trzeba usunac

            }

            public synchronized void deleteRecord(int key) {
                Data data = mp.get(key) ;

                if (data != null) {
                    mp.remove(key) ;
                    System.out.println("Usunieto");
                }
            }

            public LinkedList<Integer> getLista(int key)
            {
                System.out.println(key);
                Data data = mp.get(key);
                if (data == null)
                {
                    return null;
                }
                else
                {
                    return mp.get(key).getListaSerwerow() ;
                }
            }
    }